22d327cfbe4a3114ece4b4e2374de243a8d70730,src/main/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java,StaticTypeCheckingVisitor,getResultType,#ClassNode#number#ClassNode#BinaryExpression#,776
Before Change
} else if (isBoolIntrinsicOp(op)) {
return boolean_TYPE;
} else if (isArrayOp(op)) {
ClassNode arrayType = getType(expr.getLeftExpression());
if (ClassHelper.STRING_TYPE.equals(arrayType)) {
// special case here
return ClassHelper.STRING_TYPE;
After Change
ClassNode leftRedirect = left.redirect();
ClassNode rightRedirect = right.redirect();
Expression leftExpression = expr.getLeftExpression();
if (op == ASSIGN) {
if (leftRedirect.isArray() && !rightRedirect.isArray()) return leftRedirect;
if (leftRedirect.implementsInterface(Collection_TYPE) && rightRedirect.implementsInterface(Collection_TYPE)) {
return right;
}
if (rightRedirect.implementsInterface(Collection_TYPE) && rightRedirect.isDerivedFrom(leftRedirect)) {
// ex : def foos = ['a','b','c']
return right;
}
if (leftExpression instanceof VariableExpression) {
VariableExpression target = (VariableExpression) leftExpression;
if (target.getAccessedVariable() instanceof VariableExpression && target.getAccessedVariable()!=leftExpression) {
target = (VariableExpression) target.getAccessedVariable();
}
ClassNode initialType = target.getType().redirect();
// as anything can be assigned to a String, Class or boolean, return the left type instead
if (STRING_TYPE.equals(initialType)
|| CLASS_Type.equals(initialType)
|| Boolean_TYPE.equals(initialType)
|| isPrimitiveType(initialType)) {
return initialType;
}
}
return rightRedirect;
} else if (isBoolIntrinsicOp(op)) {
return boolean_TYPE;
} else if (isArrayOp(op)) {
ClassNode arrayType = getType(leftExpression);
if (ClassHelper.STRING_TYPE.equals(arrayType)) {
// special case here
return ClassHelper.STRING_TYPE;